package com.snow.java.base.junit;

import com.snow.java.base.entity.Student;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @类名称：
 * @类描述：
 * @author: bingHeng
 * @Date
 * @Version: 1.0
*/
public class MyStream1 {

    /**
     * Java 8中有两大改变，第一个是Lambda表达式，另一个则是Stream API（java.util.stream.*）
     *
     * Stream是Java 8中处理集合的关键抽象概念，它可以指定你希望对集合进行的操作，可以执行非常复杂的查找、过滤和映射数据等操作。
     *
     * 使用Stream API对集合数据进行操作，就类似于使用sql执行数据库查询。也可以使用 Stream API来并行执行操作。
     *
     * 简而言之，Stream API提供了一种高效且易于使用的处理数据的方式。
     *
     * 流（Stream）是数据渠道，用于操作数据源（集合、数组等）所产生的元素序列，集合讲的数据，流讲的是计算
     *
     * 注意：
     *  ①Stream自己不会储存元素
     *  ②Stream不会改变原对象，相反，他们会返回一个持有结果的新Stream
     *  ③Stream操作是延迟执行的，这意味着他们会等到需要结果的时候才执行。
     *
     *  Stream操作的三个步骤：
     *  ①创建Stream ： 一个数据源（集合、数组），获取一个流
     *  ②中间操作：一个中间操作链，对数据源的数据进行处理
     *  ③终止操作：一个终止操作，执行中间操作链，并产生结果
     */

    public static void main(String[] args) {

        // 创建Stream

        // 1. 创建Stream可以通过Collection集合系列提供的stream() (串行流)或paralleStream() （并行流）
        List<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();

        // 2. 通过Arrays 中的静态方法stream()获取数组流
        Student[] employees = new Student[10];
        Stream<Student> stream1 = Arrays.stream(employees);

        // 3. 通过Stream中的静态方法 of()
        Stream<String> aa = Stream.of("aa", "bb", "cc");

        // 4. 创建无限流

        // 4.1 迭代
        Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);
        iterate.limit(10).forEach(System.out::println);

        // 4.2 生成
        Stream.generate(() -> Math.random()).limit(6).forEach(System.out::println);
    }


}
